본문으로 건너뛰기

2.25~2.29Readme

정교한 문자열 조작을 위해 템플릿 리터럴 타입 조작하자

  • 템플릿 리터럴 타입은 백틱 보간을 사용한다.
type Literal = "literal";
type Template = `template ${Literal}`;
const str : Template = 'template literal'
const str = 'template 123'/ 에러 발생
  • 정해진 문자열만 변수에 대입할 수 있음을 알 수 있다.

추가적인 타입 검사에는 satisfies 연산자를 사용

  • satisfies 연산자는 타입 추론을 그대로 활용하면서 타입 검사를 하고 싶을 때 사용한다.
const universe = {
sun: "star",
sriius: "star",
earth: { type: "planet", parent: "sun" },
};
  • 위 예제서 오타를 잡기 위해 인덱스 시그니처를 활용할 수 있다.
const univers: {
[key in "sun" | "sirius" | "earth"]:
| { type: string; partent: string }
| string;
};
  • 다만 위 경우 속성 값을 사용시 객체로 타입을 유니온으로 사용해 문자열일수도 있다 판단하여 오류가 발생한다.
  • 이떄 satisfies 연산자를 사용하면 타입추론은 그대로가며 오타를 발견할 수 있다.

타입 스크립트는 건망증이 심하다.

try {} catch(
if(error as Error)
{
error.message
}
)
  • 위 경우 if 문안에서 as로 강제 주장 시 잠시 Error`` 타입으로 추론 후 unknown` 돌리는 문제가 발생한다.
  • 이를 해결하기 위해 Error는 클래스 인스턴스임으로 instanseof를 사용할 수 있다.

원시자료형에도 브랜딩 기법을 사용할 수 있다.

function kmToMile (km : number)
{
return km * 0.62;
}
const mile = kmToMile(3)
  • 이 경우 숫자가 킬로미터 인지 마일 단위인지 알 수 없다.
  • 이 때 브랜딩 기법을 사용해서 더욱 구체적으로 타입을 정할 수 있다.
type Brand<T,B> = T & {_brand: B};
type KM = Brand<number, "km">;
type Mile = Brand<number, "mile>

  • 이를 이용하여 KMMILE타입을 알 수 있다.